package educar.gui.admin;

import educar.controllers.EditPerteneceController;
import educar.controllers.IController;
import educar.controllers.WindowDispose;
import educar.gui.IView;
import educar.idioma.Locale;
import educar.listeners.ButtonListener;
import educar.models.Cargo;
import educar.models.Facultad;
import educar.models.Pertenece;
import educar.models.Teacher;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;

import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import javax.swing.SwingConstants;


public class EditPertenece implements IView {
		/*Ventana principal*/
		private JFrame jfWindow;
		
		private String dedicacion = "8";
		private Facultad facultad;		
		private Cargo cargo;
		/*campo responsable*/
		private Teacher docente;
		/*lista de docentes disponibles*/
		private Teacher[] teachers = {};
		private Cargo[] cargos = {};
		private Facultad[] facultades = {};
		private JComboBox cargosBox;
		private JComboBox docentesBox;
		private JComboBox facultadBox;
		private JRadioButton rdbtnFull;
		private JRadioButton rdbtnMid;
		private JRadioButton rdbtnPart;
		
		/**
		 * Constructor de la Clase
		 * Crea la ventana que permite definir una
		 * nueva materia y lo almacena en la variable materia
		 * luego se podra obtener atraves de un getMateria
		 * @param newAccion "accion que da nombre a la ventana" 
		 */
		public EditPertenece(Teacher[] teacherList,Cargo[] cargos,Facultad[] facultad,Pertenece old) {
			this.teachers = teacherList;
			this.cargos = cargos;
			this.facultades = facultad;
			/*configuro y creo la ventana*/
			jfWindow = new JFrame();		
			jfWindow.setIconImage(Toolkit.getDefaultToolkit().getImage(IView.class.getResource("/educar/media/educar-icon2.png")));
			/*Segun la dimension de la pantalla (resolucion) Centro la ventana*/
			Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
			Point framePos=new Point((int)(screenSize.width)/2-200,(int)(screenSize.height)/2-150);
			jfWindow.setLocation(framePos);
			/*Renombro la ventana*/
			jfWindow.setTitle(Locale.EDIT+" "+Locale.TEACHER+" - "+Locale.FACULTY);
			/*obtengo el panel contenedor y lo configuro*/
			Container container = jfWindow.getContentPane();
			setupMainContainer(container,old);		
			Component verticalGlue = Box.createVerticalGlue();
			verticalGlue.setPreferredSize(new Dimension(0, 5));
			jfWindow.getContentPane().add(verticalGlue);
			/*configura otras caracteristicas*/
			jfWindow.pack();
			jfWindow.setVisible(true);
			jfWindow.setResizable(false);
			jfWindow.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}

		/**
		 * Configura el contenedor de la ventana
		 * */
		private void setupMainContainer(Container container,Pertenece old) {
			/*Configura el estilo del contenedor y le agrega un borde en blanco*/
			container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));
			((JComponent) container).setBorder(new EmptyBorder(10, 10, 10, 10));

			/*Agrega un texto*/
			JLabel lblWelcome = new JLabel(Locale.EDIT+" "+Locale.TEACHER+" - "+Locale.FACULTY);
			lblWelcome.setAlignmentX(Component.CENTER_ALIGNMENT);
			lblWelcome.setFont(new Font("Serif", Font.BOLD, 16));
			lblWelcome.setBorder(new EmptyBorder(0, 10, 10, 10));
			container.add(lblWelcome);

			
			/*Agrega la casilla de responsable*/
			JLabel lblresponsableMateria = new JLabel(Locale.RESPONSIBLE+" :   ");
			lblresponsableMateria.setHorizontalAlignment(SwingConstants.RIGHT);
			JPanel responsableMateriaPane = new JPanel();
			responsableMateriaPane.setLayout(new BorderLayout(0, 0));
			responsableMateriaPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
			responsableMateriaPane.add(lblresponsableMateria,BorderLayout.CENTER);
			docentesBox = teacherSelector();
			responsableMateriaPane.add(docentesBox,BorderLayout.LINE_END);
			container.add(responsableMateriaPane, BorderLayout.PAGE_END);

			/*Agrega la casilla de facultad*/
			JLabel lblFacultad = new JLabel(Locale.FACULTY+" :   ");
			lblFacultad.setHorizontalAlignment(SwingConstants.RIGHT);
			JPanel facultadPane = new JPanel();
			facultadPane.setLayout(new BorderLayout(0, 0));
			facultadPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
			facultadPane.add(lblFacultad,BorderLayout.CENTER);
			facultadBox = facultadSelector();
			facultadPane.add(facultadBox,BorderLayout.LINE_END);
			container.add(facultadPane, BorderLayout.PAGE_END);
			
			/*Agrega la casilla de cargo*/
			JLabel lblcargo = new JLabel(Locale.CHARGE+" :   ");
			lblcargo.setHorizontalAlignment(SwingConstants.RIGHT);
			JPanel cargoPane = new JPanel();
			cargoPane.setLayout(new BorderLayout(0, 0));
			cargoPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
			cargoPane.add(lblcargo,BorderLayout.CENTER);
			cargosBox = chargeSelector();
			cargoPane.add(cargosBox,BorderLayout.LINE_END);
			container.add(cargoPane, BorderLayout.PAGE_END);

			
		    /*Crea un panel que contiene los botones*/
			JPanel buttonsPane = new JPanel();
			buttonsPane.setLayout(new BoxLayout(buttonsPane, BoxLayout.LINE_AXIS));
			
			/*Creo el Boton Add*/
			JButton bAdd = new JButton(Locale.SAVE);
			bAdd.setAlignmentX(Component.LEFT_ALIGNMENT);
			ButtonListener buttonListener = new ButtonListener();
			IController editController = new EditPerteneceController(old);
			editController.setView(this);
			buttonListener.associate(bAdd, editController);	
			
			
			/*Creo el Boton Close*/
			JButton bExit = new JButton(Locale.CLOSE);
			ButtonListener closeListener = new ButtonListener();
			IController closeController = new WindowDispose();
			closeController.setView(this);
			closeListener.associate(bExit, closeController);	
			
			Component verticalGlue = Box.createVerticalGlue();
			verticalGlue.setPreferredSize(new Dimension(0, 10));
			jfWindow.getContentPane().add(verticalGlue);
			bExit.setAlignmentX(Component.RIGHT_ALIGNMENT);
		
			
			/*Creo un panel que contiene los radio buttons*/
			JPanel panel = new JPanel();
			panel.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Dedication", TitledBorder.LEADING, TitledBorder.TOP, null, null));
			container.add(panel);
			/**
			 * Creo los radio buttons
			 */		
			/*Boton Admin*/
			rdbtnFull = new JRadioButton(Locale.FULL_TIME);
			rdbtnFull.setSelected(true);
			rdbtnFull.addActionListener(new ActionListener () {public void actionPerformed(ActionEvent e){setDedicacion("8");}});
			panel.add(rdbtnFull);		
			/*Boton Teacher*/
			rdbtnMid = new JRadioButton(Locale.MID_TIME);
			rdbtnMid.addActionListener(new ActionListener () {public void actionPerformed(ActionEvent e){setDedicacion("6");}});
			panel.add(rdbtnMid);		
			/*Boton Student*/
			rdbtnPart = new JRadioButton(Locale.PART_TIME);
			rdbtnPart.addActionListener(new ActionListener () {public void actionPerformed(ActionEvent e){setDedicacion("4");}});
			panel.add(rdbtnPart);	
			
			/*Agrupo los botones para que sean excluyentes*/
		    ButtonGroup group = new ButtonGroup();
		    group.add(rdbtnFull);
		    group.add(rdbtnMid);
		    group.add(rdbtnPart);
			
			
			/*Agrego los Botones Guardar-Salir*/
			
			Component verticalGlue_1 = Box.createVerticalGlue();
			verticalGlue_1.setPreferredSize(new Dimension(0, 5));
			jfWindow.getContentPane().add(verticalGlue_1);
			buttonsPane.add(bAdd);
			/*Un separador entre los botones*/
			Component verticalStrut = Box.createVerticalStrut(20);
			verticalStrut.setMaximumSize(new Dimension(10, 20));
			buttonsPane.add(verticalStrut);
			buttonsPane.add(bExit);
			/*agrego el panel de botones al final del cuadro principal*/
			container.add(buttonsPane, BorderLayout.PAGE_END);	

			
		}
		/**
		 * TODOS LOS SET Y GET DE LA CLASE
		 */
	
		
		
		
		/**
		 * Funcion que devuelve el responsable de la materia a crear
		 * @return "string que contiene el responsable"
		 */
		public Teacher getDocente() {
			return docente;
		}
		
		/**
		 * Establece el responsable viejo de la materia
		 * @param oldMateriaResponsable "string con el responsable"
		 */
		public void setDocente(Teacher oldDocente) {
			docente = oldDocente;
		}
		
		public void setDocenteAndBox(Teacher docente) {
			setDocente(docente);
			docentesBox.setSelectedItem(docente);
		}
		
		
		public String getDedicacion() {
			return dedicacion;
		}

		public void setDedicacion(String dedicacion) {
			this.dedicacion = dedicacion;
		}
		
		public void setDedicacionAndButtons(String dedicacion) {
			setDedicacion(dedicacion);
			if (dedicacion.equals("4")) {}
			if (dedicacion.equals("6")) {}
			if (dedicacion.equals("8")) {}
		}

		public Facultad getFacultad() {
			return facultad;
		}

		public void setFacultad(Facultad facultad) {
			this.facultad = facultad;
		}
		
		public void setFacultadAndBox(Facultad facultad) {
			setFacultad(facultad);
			facultadBox.setSelectedItem(facultad);
		}

		public Cargo getCargo() {
			return cargo;
		}

		public void setCargo(Cargo cargo) {
			this.cargo = cargo;
		}
		
		public void setCargoAndBox(Cargo cargo) {
			setCargo(cargo);
			cargosBox.setSelectedItem(cargo);
		}

		/**
		 * Crea una lista desplegable con los docentes disponibles
		 * cuando se selecciona uno se actualiza la variable responsable
		 * @return JComboBox "lista de usuarios disponibles"
		 */
		private JComboBox teacherSelector() {
			final JComboBox comboBox = new JComboBox(teachers);
			comboBox.setPreferredSize(new Dimension(300, 20));
			comboBox.setSelectedItem(null);
			comboBox.setToolTipText("Select a Teacher");
			comboBox.setVerifyInputWhenFocusTarget(false);
			comboBox.setMinimumSize(new Dimension(150, 20));		
			/*agrego un listener a los items para que cambie la variable user*/
			comboBox.addItemListener(new ItemListener(){
				  public void itemStateChanged(ItemEvent ie){
					  /*obtengo el usuario seleccionado*/
					  setDocente((Teacher)comboBox.getSelectedItem());
				  }
			  	});		
			return comboBox;
		}
		
		
		/**
		 * Crea una lista desplegable con los cargos disponibles
		 * cuando se selecciona uno se actualiza la variable cargo
		 * @return JComboBox "lista de usuarios disponibles"
		 */
		private JComboBox chargeSelector() {
			final JComboBox comboBox = new JComboBox(cargos);
			comboBox.setPreferredSize(new Dimension(300, 20));
			comboBox.setSelectedItem(null);
			comboBox.setToolTipText("Select a Charge");
			comboBox.setVerifyInputWhenFocusTarget(false);
			comboBox.setMinimumSize(new Dimension(150, 20));		
			/*agrego un listener a los items para que cambie la variable user*/
			comboBox.addItemListener(new ItemListener(){
				  public void itemStateChanged(ItemEvent ie){
					  /*obtengo el usuario seleccionado*/
					  setCargo((Cargo)comboBox.getSelectedItem());
				  	}
				  });		
			return comboBox;
		}
		
		
		/**
		 * Crea una lista desplegable con las facultad disponibles
		 * cuando se selecciona uno se actualiza la variable cargo
		 * @return JComboBox "lista de usuarios disponibles"
		 */
		private JComboBox facultadSelector() {
			final JComboBox comboBox = new JComboBox(facultades);
			comboBox.setPreferredSize(new Dimension(300, 20));
			comboBox.setSelectedItem(null);
			comboBox.setToolTipText("Select a Facultad");
			comboBox.setVerifyInputWhenFocusTarget(false);
			comboBox.setMinimumSize(new Dimension(150, 20));		
			/*agrego un listener a los items para que cambie la variable user*/
			comboBox.addItemListener(new ItemListener(){
				  public void itemStateChanged(ItemEvent ie){
					  /*obtengo el usuario seleccionado*/
					  setFacultad((Facultad)comboBox.getSelectedItem());
					 }
				  });		
			return comboBox;
		}
		
		
	/**
	 * Cierra la ventana actual sin salir del programa
	 */
	public void close(){
		jfWindow.dispose();
	}

	/**
	 * Permite Agregar un listener a la ventana
	 * @param windowAdapter
	 */
	public void addWindowListener(WindowAdapter windowAdapter) {
		jfWindow.addWindowListener(windowAdapter);
		
	}
	
	/**
	 * Sirve para abrir una ventana con texto
	 * @param model "texto a mostrar"
	 */
	public void present(String model) {
		JOptionPane.showMessageDialog(null, model," " + Locale.MESSAGE,1);
	}
	
	/**
	 * Sirve para abrir un carte de warning
	 * @param msg "String texto del mensaje"
	 * @param title "String titulo de la ventana"
	 */
	public void presentWarning(String msg,String title) {
		JOptionPane.showMessageDialog(null,msg,title,JOptionPane.WARNING_MESSAGE);
	}
	
}		
		